package club.babyf.nativeai.demo.algorithm;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * _16_SequentialNumberPrinter.
 *
 * @author zhanglei.
 * @date 2025/6/22 22:53.
 * @description 序列号打印机.
 * 实现一个方法，从1开始按顺序输出连续的数字，输入参数是一个数字。
 * 输入时不保证顺序，收到连续的数字时，就输出结果。如果不连续，则不输出。
 * 比如，输入2，5，9，3，此时不输出结果。再输入1，此时输出1，2，3。再输入4，此时输出4，5。再输入6，输出6.……
 */
public class _16_SequentialNumberPrinter {

    /**
     * 下一个期望输出的数字
     */
    private int next = 1;

    /**
     * 存储未输出的数字
     */
    private final HashSet<Integer> numberSet = new HashSet<>();

    public void receive(int num) {
        // 如果数字已被输出或小于next，则忽略（避免冗余）
        if (num < next || numberSet.contains(num)) {
            return;
        }

        // 加入集合
        numberSet.add(num);
        // 存储当前连续序列
        List<Integer> sequence = new ArrayList<>();

        // 检查并收集连续序列
        while (numberSet.contains(next)) {
            sequence.add(next);
            // 移除已处理的数字
            numberSet.remove(next);
            next++;
        }

        // 如果收集到连续序列，则输出
        if (!sequence.isEmpty()) {
            System.out.println(formatSequence(sequence));
        }
    }

    /**
     * 格式化连续序列输出（如"1,2,3"）
     *
     * @param sequence 连续序列列表
     * @return 格式化连续序列输出
     */
    private String formatSequence(List<Integer> sequence) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < sequence.size(); i++) {
            sb.append(sequence.get(i));
            if (i < sequence.size() - 1) {
                sb.append(",");
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        _16_SequentialNumberPrinter printer = new _16_SequentialNumberPrinter();
        int[] inputs = {2, 5, 9, 3, 1, 4, 6};
        System.out.println("输入顺序: 2,5,9,3,1,4,6");
        System.out.println("输出结果:");
        for (int num : inputs) {
            printer.receive(num);
        }
    }

}
